﻿/**
 *@desc			消息类的基本定义
 *@author		吴建凰
 &@date			2014年3月27日
 */
#pragma once
#include <ossMsgDefine.h>
#include <ossLock.h>
#include <json/ossJson.h>

/**
 *		 消息任务的回调函数
 *@pMsgParam	    消息参数
 *@iParamLen        消息大小
 *@return           无
 */
typedef void (OssObject::*OssMsgTaskCallbackFun)(void* pMsgParam,int iParamLen);

/**
 *		消息类的基本定义，所有需要实现消息的类必须继承该类
 */
class OssMsgBase :public OssObject
{
public:
	OssMsgBase(OssMsgBase* pParent = NULL);
	virtual ~OssMsgBase(void);

	/**
	 *		Send发送命令消息
	 *		cmd		命令
	 *		wparam	命令参数1
	 *		lparam	命令参数2
	 *@return 如果没有找执行函数，则返回MSG_NOFUNCTION
	 */
	int SendCommand(const char* cmd,WParam wparam,LParam lparam);

	/**
	 *		发送用户
	 */
	int SendMessage(DWord msg,WParam wparam,LParam lparam);

	/**
	 *		广播消息
	 *@msg		广播消息ID
	 *@wparam	参数
	 *@lparam	参数
	 */
	int BroadCastCommand(const char* cmd,WParam wparam,LParam lparam);

	/**
	 *		广播消息
	 *@msg		广播消息ID
	 *@wparam	参数
	 *@lparam	参数
	 */
	int BroadCastMessage(DWord nCode,WParam wparam,LParam lparam);

	/**
	 *		发送请求命令
	 *@cmd			命令
	 *@request		命令请求
	 *@response		命令反馈
	 *@return		返回处理结果，参考“消息返回值定义”
	 */
	int SendRequestCommand(const char* cmd,const OssJson& request,OssJson& response);

	/**
	 *		发送请求消息
	 *@dwMsgId		消息ID
	 *@request		命令请求
	 *@response		命令反馈
	 *@return		返回处理结果，参考“消息返回值定义”
	 */
	int SendRequestMessage(DWord dwMsgId, const OssJson& request, OssJson& response);


    /**
     *      设置父窗口句柄
     */
    void SetParent(OssMsgBase* pParent);

    /**
     *      获取父句柄
     */
	OssMsgBase	*GetParent();

	/**
	 *		设置可用状态
	 */
	void SetAvailableStatus(Bool bAvailable);
	Bool GetAvailableStatus();
protected:

	//声明消息映射表
	DECLARE_OSS_MESSAGE_MAP()

	/**
	 *		派发消息
	 */
	virtual int DispatchMsg(LPMsgItem lpmsg );

	/**
	 *		 向所有的子结点派发消息
	 */
	int DispatchBroadCastMsg(MsgItem* pMsgItem);

private:
    OssCritical     m_childCritical;
	OssListNode		m_node;
	OssMsgBase	*m_pParent;		//父句柄
	OssListNode		m_childList;	//子列表
	Bool            m_bVailable;	//可用的
};

